package ooo.reindeer.logging;

import ooo.reindeer.commons.Property;

import java.util.ServiceLoader;

public class LogUtil {

    private static ILogger root;

    static {

        ServiceLoader<ILogger> loggers = ServiceLoader.load(ILogger.class);
        String loggerClass = Property.get("logger.logger", "*");
        ILogger temp;
        for (ILogger logger : loggers) {
            temp = logger;

            if (loggerClass.equals("*") || temp.getClass().toString().equals(loggerClass)) {
                root = temp;
                break;
            }
        }

        if (root == null) {
            root = new DefaultLogger();
        }
    }

    public static void debug(String var1) {
        root.debug(var1);
    }

    public static void debug(String var1, Object var2) {
        root.debug(var1, var2);
    }

    public static void debug(String var1, Object var2, Object var3) {
        root.debug(var1, var2, var3);
    }

    public static void debug(String var1, Object... var2) {
        root.debug(var1, var2);
    }

    public static void debug(String var1, Throwable var2) {
        root.debug(var1, var2);
    }

    public static void error(String var1) {
        root.error(var1);
    }

    public static void error(String var1, Object var2) {
        root.error(var1, var2);
    }

    public static void error(String var1, Object var2, Object var3) {
        root.error(var1, var2, var3);
    }

    public static void error(String var1, Object... var2) {
        root.error(var1, var2);
    }

    public static void error(String var1, Throwable var2) {
        root.error(var1, var2);
    }

    public static ILogger getLogger(String logger) {
        return root.getLogger(logger);
    }

    public static ILogger getLogger(Class clazz) {
        return root.getLogger(clazz);
    }

    public static String getName() {
        return root.getName();
    }

    public static void info(String var1) {
        root.info(var1);
    }

    public static void info(String var1, Object var2) {
        root.info(var1, var2);
    }

    public static void info(String var1, Object var2, Object var3) {
        root.info(var1, var2, var3);
    }

    public static void info(String var1, Object... var2) {
        root.info(var1, var2);
    }

    public static void info(String var1, Throwable var2) {
        root.info(var1, var2);
    }

    public static boolean isDebugEnabled() {
        return root.isDebugEnabled();
    }

    public static boolean isErrorEnabled() {
        return root.isErrorEnabled();
    }

    public static boolean isInfoEnabled() {
        return root.isInfoEnabled();
    }

    public static boolean isTraceEnabled() {
        return root.isTraceEnabled();
    }

    public static boolean isWarnEnabled() {
        return root.isWarnEnabled();
    }

    public static void trace(String var1) {
        root.trace(var1);
    }

    public static void trace(String var1, Object var2) {
        root.trace(var1, var2);
    }

    public static void trace(String var1, Object var2, Object var3) {
        root.trace(var1, var2, var3);
    }

    public static void trace(String var1, Object... var2) {
        root.trace(var1, var2);
    }

    public static void trace(String var1, Throwable var2) {
        root.trace(var1, var2);
    }

    public static void warn(String var1) {
        root.warn(var1);
    }

    public static void warn(String var1, Object var2) {
        root.warn(var1, var2);
    }

    public static void warn(String var1, Object... var2) {
        root.warn(var1, var2);
    }

    public static void warn(String var1, Object var2, Object var3) {
        root.warn(var1, var2, var3);
    }

    public static void warn(String var1, Throwable var2) {
        root.warn(var1, var2);
    }

}
